package com.atguigu.tingshu.common.config.thread;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author: atguigu
 * @create: 2023-11-18 11:25
 */
@Configuration
public class ThreadPoolConfig {

    /**
     * 线程池配置 核心数建议等于最大线程数，避免线程创建销毁带来系统开销
     * 应用类型：
     * Java业务类型应用 IO 密集型 cpu核*2   一旦线程发生IO（文件IO，网络IO）线程释放掉CPU执行权
     * 视频转码，图像识别，大数据模型计算。计算密集型  cpu核数
     *
     * @return
     */
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        //JVM中Runtime（单例） 逻辑处理器数量
        int count = Runtime.getRuntime().availableProcessors() * 2;
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                count,//核心线程数
                count,//最大线程数
                0,//非核心线程空闲时间
                TimeUnit.SECONDS,//时间单位
                new ArrayBlockingQueue<>(200),//阻塞队列
                Executors.defaultThreadFactory(),//线程工厂
                (r, t) -> {
                    //被拒绝任务再次提交给线程池执行: 所有核心线程被占用，阻塞队列满，【非核心线程满】，触发拒绝策略
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    t.submit(r);
                }//拒绝策略
        );
        //如果启动后立即有大量任务需要执行
        threadPoolExecutor.prestartCoreThread();
        return threadPoolExecutor;
    }
}
